package com.sojson.util.json;

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.sojson.util.json.impl.FastJsonUtilImpl;

/**
 * Json工具类
 * 
 * @author liu
 * @date 2020-11-02
 */
public class JsonUtil {

    private static final JsonUtilInterface JSON_UTIL_INTERFACE = FastJsonUtilImpl.getInstances();

    /**
     * 将对象转换成json字符串(值为空的不解析)
     * 
     * @param data 被转换的对象
     * @return 得到的字符串
     */
    public static String objectToJson(Object data) {
        return JSON_UTIL_INTERFACE.objectToJson(data);
    }

    /**
     * 将对象转换成json字符串(值为空的也解析)
     * 
     * @param data 被转换的对象
     * @return 得到的字符串
     */
    public static String objectToJsonAll(Object data) {
        return JSON_UTIL_INTERFACE.objectToJsonAll(data);
    }

    /**
     * 将json字符串转换成对象
     * 
     * @param jsonData json字符串
     * @param beanType 要转换成的对象的类型
     * @return 得到的对象
     */
    public static <T> T jsonToObject(String jsonData, Class<T> beanType) {
        return JSON_UTIL_INTERFACE.jsonToObject(jsonData, beanType);
    }

    /**
     * 将json数据转换成指定类型的list
     * 
     * @param <T>
     * @param jsonData json字符串
     * @param beanType 要转换成的list的类型
     * @return 得到的list
     */
    public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
        return JSON_UTIL_INTERFACE.jsonToList(jsonData, beanType);
    }

    /**
     * 将json数据转换成指定类型的map
     * 
     * @param <T> Map的Key
     * @param <K> Map的Value
     * @param jsonData json字符串
     * @return 得到的Map
     */
    public static <T, K> Map<T, K> jsonToMap(String jsonData) {
        return JSON_UTIL_INTERFACE.jsonToMap(jsonData);
    }

    /**
     * 将Json字符串格式化后输出
     * 
     * @param str
     * @return
     */
    public static String format(String str) {
        JSONObject object = JSONObject.parseObject(str);
        return JSON.toJSONString(object, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteDateUseDateFormat);
    }

}